import pandas as pd

from common.handleExcel import slice_colum_from_dataframe, move_column


def part21_cal_merge_data(dfleft,dfright,oncoloumn_name):
    # 步骤1.通过电子监管号匹配表2.，匹配不上的宗地即为成果表1.中闲置土地类型为"基数内闲置土地"的
    # part2基数清单 与 part2基数已处置清单进行匹配,保留左右侧所有行数据
    # indicator=True 参数会在合并后的 DataFrame 中添加一个名为 _merge 的列，指示每行数据来自哪个表
    # merged_df[merged_df['_merge'] == 'left_only']--于筛选仅存在于左边的 DataFrame 的行
    # merged_df[merged_df['_merge'] == 'right_only']--于筛选仅存在于右边的 DataFrame 的行
    # merged_df[merged_df['_merge'] == 'both']--于筛选仅存在于右边的 DataFrame 的行和右边的 DataFrame 的行
    merged_df = pd.merge(dfleft, dfright,
                         on=[oncoloumn_name],
                         how='outer',
                         indicator=True)

    # 保留左边存在而右边不存在的行（左集合-右集合)
    # 根据 电子监管号前16位 匹配 左集合保留剩下去除匹配电子监管号前16位的数据
    merged_df_left_only = merged_df[merged_df['_merge'] == 'left_only']
    # 右集合 保留匹配不上的数据(
    merged_df_right_only = merged_df[merged_df['_merge'] == 'right_only']

    merged_df_both = merged_df[merged_df['_merge'] == 'both']
    return merged_df_left_only,merged_df_right_only,merged_df_both

#获取--基数内闲置土地
#table1_4baselist_df---基数清单(电子监管号 合同编号 实际管理区)
#table2_4handledlist_df--基数已处置清单(电子监管号 合同编号)
#df4Conty2City 实际管理区	设区市
def part21_cal_idleland_by_baselist_sub_handledlist(table1_4baselist_df,
                                    table2_4handledlist_df,
                                     df4Conty2City):
    # 获取 '电子监管号' 列为空的数据
    # 电子监管号 合同编号 实际管理区
    emptyEpc4table1_4baselist_df = table1_4baselist_df[table1_4baselist_df['电子监管号'].isnull()]

    # 获取 '电子监管号' 列不为空的数据
    # 电子监管号 合同编号 实际管理区
    notEmptyEpc4table1_4baselist_df =  table1_4baselist_df[table1_4baselist_df['电子监管号'].notnull()]


    #提取电子监管号的前16位生成新列--电子监管号前16位--并挪动到第一列
    #电子监管号前16位 电子监管号 合同编号 实际管理区
    addprefix16Epc4NotEmptyEpc4table1_4baselist_df = slice_colum_from_dataframe(notEmptyEpc4table1_4baselist_df,
                                           '电子监管号',
                                           16,
                                           '电子监管号前16位')

    # 获取 '电子监管号' 列为空的数据
    #电子监管号 合同编号
    emptyEpc4table2_4handledlist_df = table2_4handledlist_df[table2_4handledlist_df['电子监管号'].isnull()]

    # 获取 '电子监管号' 列不为空的数据
    #电子监管号 合同编号
    notEmptyEpc4table2_4handledlist_df = table2_4handledlist_df[table2_4handledlist_df['电子监管号'].notnull()]

    # 提取电子监管号的前16位生成新列--电子监管号前16位--并挪动到第一列
    # 电子监管号前16位 电子监管号 合同编号
    addprefix16Epc4notEmptyEpc4table2_4handledlist_df = slice_colum_from_dataframe(notEmptyEpc4table2_4handledlist_df,
                                                          '电子监管号',
                                                          16,
                                                          '电子监管号前16位')


    #电子监管号前16位 电子监管号 合同编号 实际管理区
    #电子监管号前16位 电子监管号 合同编号
    #'电子监管号前16位', '电子监管号_x', '合同编号_x', '实际管理区', '电子监管号_y', '合同编号_y',  '_merge'
    merged_df_left_only,merged_df_right_only,merged_df_both = part21_cal_merge_data(addprefix16Epc4NotEmptyEpc4table1_4baselist_df,
                          addprefix16Epc4notEmptyEpc4table2_4handledlist_df,
                          '电子监管号前16位')


    #------------------------------------------------------------------
    #merged_df_left_only  '电子监管号前16位', '电子监管号_x', '合同编号_x', '实际管理区', '电子监管号_y', '合同编号_y',  '_merge'
    #                       0                  1            2           3          4            5             6
    #删除_merge列
    merged_df_left_only = merged_df_left_only.drop(columns=merged_df_left_only.columns[[0,4,5,6]])
    # emptyEpc4table1_4baselist_df 前3列名称： 电子监管号 合同编号 实际管理区
    merged_df_left_only.columns = emptyEpc4table1_4baselist_df.columns
    # merged_df_left_only  '电子监管号', '合同编号', '实际管理区'
    # emptyEpc4table1_4baselist_df  '电子监管号', '合同编号', '实际管理区'
    merged_df_left_only = pd.concat([merged_df_left_only, emptyEpc4table1_4baselist_df], ignore_index=True)



    # ------------------------------------------------------------------
    #'电子监管号前16位', '电子监管号_x', '合同编号_x', '实际管理区', '电子监管号_y', '合同编号_y',  '_merge'
    # 0                1                2          3           4            5             6
    merged_df_right_only = merged_df_right_only.drop(columns=merged_df_right_only.columns[[0,1,2,3,6]])
    merged_df_right_only.columns = emptyEpc4table2_4handledlist_df.columns
    #merged_df_right_only '电子监管号', '合同编号'
    #emptyEpc4table2_4handledlist_df 电子监管号 合同编号
    merged_df_right_only = pd.concat([merged_df_right_only,
                                      emptyEpc4table2_4handledlist_df], ignore_index=True)



    #'电子监管号', '合同编号', '实际管理区'
    #'电子监管号', '合同编号'
    mergeddf_left_only,mergeddf_right_only,mergeddf_both = part21_cal_merge_data(merged_df_left_only,
                                                                     merged_df_right_only,
                                                                     '合同编号')
    # '电子监管号_x', '合同编号', '实际管理区','电子监管号_y','_merge'
    # 0               1         2            3          4
    mergeddf_left_only = mergeddf_left_only.drop(columns=mergeddf_left_only.columns[[3,4]])
    #'电子监管号', '合同编号', '实际管理区'
    mergeddf_left_only.columns = emptyEpc4table1_4baselist_df.columns


    #'电子监管号_x', '合同编号', '实际管理区','电子监管号_y','_merge'
    #  0            1            2           3          4
    mergeddf_right_only = mergeddf_right_only.drop(columns=mergeddf_right_only.columns[[0,2,4]])
    mergeddf_right_only = move_column(mergeddf_right_only, '电子监管号_y')
    mergeddf_right_only.columns = emptyEpc4table2_4handledlist_df.columns

    mergeddf_left_only['闲置土地类型'] = '基数内闲置土地'

    # '电子监管号', '合同编号', '实际管理区','闲置土地类型'
    mergeddf_left_only.columns = mergeddf_left_only.columns.str.strip()
    # '实际管理区', '电子监管号', '合同编号', '闲置土地类型'
    mergeddf_left_only = move_column(mergeddf_left_only, '实际管理区')

    # '实际管理区', '电子监管号', '合同编号', '闲置土地类型'
    # df4Conty2City 实际管理区	设区市
    mergeddf_left_only = pd.merge(mergeddf_left_only, df4Conty2City, on='实际管理区', how='left')
    # '实际管理区', '电子监管号', '合同编号', '闲置土地类型' '设区市'
    mergeddf_left_only = move_column(mergeddf_left_only, '设区市')

    return mergeddf_left_only,mergeddf_right_only

#该表格清单内的所有宗地，即为当下时点的年内新增闲置土地，即成果表1.中的“年内新增闲置土地
#3.年内新增清单（匹配用，实时更新）table3_4withyear_new_increaselist_df---电子监管号 合同编号
# 地方反馈年内新增归属 epc2county2cityTable4Local---电子监管号 实际管理区  设区市
# 1.闲置周报表格逻辑关系--行政区划代码对应countyCode2CountyName2City---行政区代码前六位	实际管理区	设区市
# 先用地方反馈年内新增归属（电子监管号 实际管理区  设区市）进行电子监管号匹配，匹配不上的再用行政区划代码对应匹配
def part21_cal_withyear_new_increase_idleland(table3_4withyear_new_increaselist_df,
                                          epc2county2cityTable4Local,
                                          countyCode2CountyName2City):
    #电子监管号	合同编号
    merged_df = table3_4withyear_new_increaselist_df.iloc[:, :2].copy()
    # merged_df['闲置土地类型'] = '年内新增闲置土地'
    merged_df.loc[:, '闲置土地类型'] = '年内新增闲置土地'

    #merged_df ---电子监管号	合同编号  闲置土地类型
    #epc2county2cityTable4Local---电子监管号 实际管理区  设区市
    #电子监管号	合同编号  闲置土地类型 实际管理区  设区市
    merged_df = pd.merge(merged_df, epc2county2cityTable4Local, on='电子监管号', how='left')
    merged_df = move_column(merged_df, '实际管理区')
    merged_df = move_column(merged_df, '设区市')


    #设区市 实际管理区  电子监管号	合同编号  闲置土地类型
    notEmptyCountyName4Merged_df = merged_df[merged_df['实际管理区'].notnull()]
    emptyCountyName4Merged_df = merged_df[merged_df['实际管理区'].isnull()]
    emptyCountyName4Merged_df =  slice_colum_from_dataframe(emptyCountyName4Merged_df,
                                               '电子监管号',
                                               6,
                                               '行政区代码前六位')
    #emptyCountyName4Merged_df--行政区代码前六位 设区市 实际管理区  电子监管号	合同编号  闲置土地类型
    #countyCode2CountyName2City--行政代码前六位 实际管理区  设区市
    #行政区代码前六位 设区市_x 实际管理区_x  电子监管号	合同编号  闲置土地类型 实际管理区_y  设区市_y
    emptyCountyName4Merged_df = pd.merge(emptyCountyName4Merged_df,
                                         countyCode2CountyName2City,
                                         on='行政区代码前六位', how='left')
    emptyCountyName4Merged_df = emptyCountyName4Merged_df.drop(columns=emptyCountyName4Merged_df.columns[[0,1,2]])
    emptyCountyName4Merged_df = move_column(emptyCountyName4Merged_df, '实际管理区_y')
    emptyCountyName4Merged_df = move_column(emptyCountyName4Merged_df, '设区市_y')
    emptyCountyName4Merged_df.columns = notEmptyCountyName4Merged_df.columns
    merged_df =  pd.concat([notEmptyCountyName4Merged_df,emptyCountyName4Merged_df], ignore_index=True)

    return merged_df
#table4_4beginyear_estimate_withyear_idlelandlist_df  '电子监管号', '合同编号', '约定动工时间','实际动工时间'
def part21_cal_beginyear_estimate_withyear_idlelandlist(table4_4beginyear_estimate_withyear_idlelandlist_df):
    import pandas as pd

    # 假设 table4_4beginyear_estimate_withyear_idlelandlist_df 已经加载
    # 确保 "约定动工时间" 列是 datetime 类型
    table4_4beginyear_estimate_withyear_idlelandlist_df['约定动工时间'] = pd.to_datetime(
        table4_4beginyear_estimate_withyear_idlelandlist_df['约定动工时间'])

    # 定义日期范围
    start_date = pd.Timestamp('2024-01-01')
    end_date = pd.Timestamp('2024-12-31')

    # 过滤数据
    filtered_df = table4_4beginyear_estimate_withyear_idlelandlist_df[
        (table4_4beginyear_estimate_withyear_idlelandlist_df['约定动工时间'] >= start_date) &
        (table4_4beginyear_estimate_withyear_idlelandlist_df['约定动工时间'] <= end_date)
        ]

    # 过滤“实际动工时间”为 空值的数据
    filtered_df = filtered_df[filtered_df['实际动工时间'].isnull()]

    return filtered_df

#已处置
#expectedIdlelandWithinYearListTable 电子监管号  合同编号
#revokedListTable  电子监管号  合同编号
def part21_handle_beginyear_estimate_withyear_idlelandlist(left_df,right_df):
    # 获取 '电子监管号' 列为空的数据
    emptyEpc4left_df = left_df[left_df['电子监管号'].isnull()]

    # 获取 '电子监管号' 列不为空的数据
    notEmptyEpc4left_df =  left_df[left_df['电子监管号'].notnull()]


    #提取电子监管号的前16位生成新列--电子监管号前16位--并挪动到第一列
    addprefix16Epc4notEmptyEpc4left_df = slice_colum_from_dataframe(notEmptyEpc4left_df,
                                           '电子监管号',
                                           16,
                                           '电子监管号前16位')


    # 获取 '电子监管号' 列为空的数据
    emptyEpc4right_df = right_df[right_df['电子监管号'].isnull()]

    # 获取 '电子监管号' 列不为空的数据
    notEmptyEpc4right_df =  right_df[right_df['电子监管号'].notnull()]


    #提取电子监管号的前16位生成新列--电子监管号前16位--并挪动到第一列
    addprefix16Epc4notEmptyEpc4right_df = slice_colum_from_dataframe(notEmptyEpc4right_df,
                                           '电子监管号',
                                           16,
                                           '电子监管号前16位')

    #电子监管号前16位  电子监管号 合同编号
    #'电子监管号前16位' '电子监管号_x' '合同编号_x' '电子监管号_y' '合同编号_y' '_merge'
    merged_df_left_only,merged_df_right_only,merged_df_both = part21_cal_merge_data(addprefix16Epc4notEmptyEpc4left_df,
                                                                                    addprefix16Epc4notEmptyEpc4right_df,
                                                                                    '电子监管号前16位')
    #'电子监管号前16位' '电子监管号_x' '合同编号_x' '电子监管号_y' '合同编号_y' '_merge'
    merged_df_both = merged_df_both.drop(columns=merged_df_both.columns[[0,3,4,5]])
    # '电子监管号', '合同编号'
    merged_df_both.columns = emptyEpc4left_df.columns
    merged_df_both1 = merged_df_both

    # '电子监管号前16位' '电子监管号_x' '合同编号_x' '电子监管号_y' '合同编号_y' '_merge'
    merged_df_left_only = merged_df_left_only.drop(columns=merged_df_left_only.columns[[0, 3, 4, 5]])
    # '电子监管号', '合同编号'
    merged_df_left_only.columns = emptyEpc4left_df.columns


    new_left_df = pd.concat([emptyEpc4left_df,merged_df_left_only], ignore_index=True)

    # '电子监管号_x' '合同编号' '电子监管号_y'  '_merge'
    merged_df_left_only,merged_df_right_only,merged_df_both = part21_cal_merge_data(new_left_df,right_df,'合同编号')
    merged_df_both = merged_df_both.drop(columns=merged_df_both.columns[[2, 3]])
    merged_df_both.columns = emptyEpc4left_df.columns

    merged_df_both2 = merged_df_both

    merged_df4left_matched = pd.concat([merged_df_both1,merged_df_both2], ignore_index=True)

    merged_df_left_only = merged_df_left_only.drop(columns=merged_df_left_only.columns[[2, 3]])
    merged_df_left_only.columns = emptyEpc4left_df.columns
    merged_df4left_not_matched = merged_df_left_only
    return  merged_df4left_matched,merged_df4left_not_matched
